package cn.kent.heima.base.methodArea;

/**
 * 字符串相关面试题: 串池对象和堆内存中对象辨析
 * 1.8 -> 将这个字符串对象尝试放入串池, 如果有则不会放入串池, 会把串池的对象返回
 * 1.6 -> 将这个字符串对象尝试放入串池, 如果有则不会放入, 如果没有则会把此对象复制一份放入串池, 会把串池中的对象返回
 */
@SuppressWarnings("all")
public class Demo_09 {
    public static void main(String[] args) {
        /*
         * 这种情况下,串池中先加入了 ["ab", "a", "b"], 就导致x是串池中的对象, s是堆中的对象, s2是串池中的对象
         * 输出结果: s2 == x --> true  s == x --> false
         */
//        String x = "ab";
//        String s = new String("a") + new String("b");  // new String("ab")
//
//        String s2 = s.intern(); // 将这个字符串对象尝试放入串池, 如果有则不会放入串池, 会把串池的对象返回
//
//        System.out.println(s2 == x);
//        System.out.println(s == x);
//        System.out.println(s2 == s);

        /*
         * 这种情况下,串池中先加入了 ["a", "b"], 堆中加入了 new String("ab")
         * s2 操作 **将s加入串池** , 此时串池变成了 ["a","b", "ab"]
         * 从而, s2是串池中"ab"对象,s也是串池中对象,所以结果均为true
         */
        String s = new String("a") + new String("b");  // new String("ab")

        String s2 = s.intern(); // 将这个字符串对象尝试放入串池, 如果有则不会放入串池, 会把串池的对象返回

        System.out.println(s2 == "ab"); // true
        System.out.println(s == "ab"); // true --> 此处是因为 s.intern 方法将s放入了串池
    }
}
